<!DOCTYPE html>
<html lang="zh">
  <head>
    <title>
        Unity3D_HW_1_井字棋 - GraphyHao&#39;s Blog
      </title>
        <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport"
      content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui">
    <meta name="renderer" content="webkit">
    <meta http-equiv="Cache-Control" content="no-transform" />
    <meta http-equiv="Cache-Control" content="no-siteapp" />
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="format-detection" content="telephone=no,email=no,adress=no">
    
    <meta name="theme-color" content="#000000" />
    
    <meta http-equiv="window-target" content="_top" />
    
    
    <meta name="description" content="井字棋" />
    <meta name="generator" content="Hugo 0.75.1 with theme pure" />
    <title>Unity3D_HW_1_井字棋 - GraphyHao&#39;s Blog</title>
    
    
    <link rel="stylesheet" href="https://graphyhao.gitee.io/css/style.min.154c4cb4eedc210cfb116dc53b5438862a3a5519e854789ff967126ae88c565c.css">
    
    <link rel="stylesheet" href="https://cdn.staticfile.org/highlight.js/9.15.10/styles/github.min.css" async>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tocbot/4.4.2/tocbot.css" async>
    <meta property="og:title" content="Unity3D_HW_1_井字棋" />
<meta property="og:description" content="井字棋" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://graphyhao.gitee.io/2021/09/21_h1/" />
<meta property="article:published_time" content="2021-09-20T07:00:04+08:00" />
<meta property="article:modified_time" content="2021-09-20T07:00:04+08:00" />
<meta itemprop="name" content="Unity3D_HW_1_井字棋">
<meta itemprop="description" content="井字棋">
<meta itemprop="datePublished" content="2021-09-20T07:00:04+08:00" />
<meta itemprop="dateModified" content="2021-09-20T07:00:04+08:00" />
<meta itemprop="wordCount" content="2740">



<meta itemprop="keywords" content="," />
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Unity3D_HW_1_井字棋"/>
<meta name="twitter:description" content="井字棋"/>

    <!--[if lte IE 9]>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/classlist/1.1.20170427/classList.min.js"></script>
      <![endif]-->

    <!--[if lt IE 9]>
        <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
      <![endif]-->
  </head>

  
  

  <body class="main-center theme-purple" itemscope itemtype="http://schema.org/WebPage"><header class="header" itemscope itemtype="http://schema.org/WPHeader">
    <div class="slimContent">
      <div class="navbar-header">
        <div class="profile-block text-center">
          <a id="avatar" href="https://graphyhao.gitee.io/" target="_self">
            <img class="img-circle img-rotate" src="https://graphyhao.gitee.io/yun.jpeg" width="200" height="200">
          </a>
          <h2 id="name" class="hidden-xs hidden-sm">GraphyHao</h2>
          <h3 id="title" class="hidden-xs hidden-sm hidden-md">瓜皮浩的博客</h3>
          <small id="location" class="text-muted hidden-xs hidden-sm"><i class="icon icon-map-marker"></i>Guangzhou, China</small>
        </div><div class="search" id="search-form-wrap">
    <form class="search-form sidebar-form">
        <div class="input-group">
            <input type="text" class="search-form-input form-control" placeholder="搜索" />
            <span class="input-group-btn">
                <button type="submit" class="search-form-submit btn btn-flat" onclick="return false;"><i
                        class="icon icon-search"></i></button>
            </span>
        </div>
        <div class="ins-search">
            <div class="ins-search-mask"></div>
            <div class="ins-search-container">
                <div class="ins-input-wrapper">
                    <input type="text" class="ins-search-input" placeholder="想要查找什么..."
                        x-webkit-speech />
                    <button type="button" class="close ins-close ins-selectable" data-dismiss="modal"
                        aria-label="Close"><span aria-hidden="true">×</span></button>
                </div>
                <div class="ins-section-wrapper">
                    <div class="ins-section-container"></div>
                </div>
            </div>
        </div>
    </form>
</div>
        <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target="#main-navbar" aria-controls="main-navbar" aria-expanded="false">
          <span class="sr-only">Toggle navigation</span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
        </button>
      </div>
      <nav id="main-navbar" class="collapse navbar-collapse" itemscope itemtype="http://schema.org/SiteNavigationElement" role="navigation">
        <ul class="nav navbar-nav main-nav">
            <li class="menu-item menu-item-home">
                <a href="/">
                    <i class="icon icon-home-fill"></i>
                  <span class="menu-title">首页</span>
                </a>
            </li>
            <li class="menu-item menu-item-archives">
                <a href="/posts/">
                    <i class="icon icon-archives-fill"></i>
                  <span class="menu-title">文章</span>
                </a>
            </li>
            <li class="menu-item menu-item-categories">
                <a href="/categories/">
                    <i class="icon icon-folder"></i>
                  <span class="menu-title">分类</span>
                </a>
            </li>
            <li class="menu-item menu-item-tags">
                <a href="/tags/">
                    <i class="icon icon-tags"></i>
                  <span class="menu-title">标签</span>
                </a>
            </li>
            <li class="menu-item menu-item-gallery">
                <a href="/gallery/">
                    <i class="icon icon-book-fill"></i>
                  <span class="menu-title">落书</span>
                </a>
            </li>
            <li class="menu-item menu-item-about">
                <a href="/about/">
                    <i class="icon icon-cup-fill"></i>
                  <span class="menu-title">关于</span>
                </a>
            </li>
        </ul>
      </nav>
    </div>
  </header>

<aside class="sidebar" itemscope itemtype="http://schema.org/WPSideBar">
  <div class="slimContent">
    
      <div class="widget">
    <h3 class="widget-title">公告</h3>
    <div class="widget-body">
        <div id="board">
            <div class="content"><p>Playing：Hotline Miami </p>
            </div>
        </div>
    </div>
</div>

      <div class="widget">
    <h3 class="widget-title"> 分类</h3>
    <div class="widget-body">
        <ul class="category-list">
            <li class="category-list-item"><a href="https://graphyhao.gitee.io/categories/%E8%BD%AF%E5%B7%A5%E5%AE%9E%E8%AE%AD/" class="category-list-link">软工实训</a><span class="category-list-count">2</span></li>
            <li class="category-list-item"><a href="https://graphyhao.gitee.io/categories/%E8%BD%AF%E5%B7%A5%E5%AF%BC%E8%AE%BA/" class="category-list-link">软工导论</a><span class="category-list-count">12</span></li>
        </ul>
    </div>
</div>
      <div class="widget">
    <h3 class="widget-title"> 标签</h3>
    <div class="widget-body">
        <ul class="tag-list">
            
            
            <li class="tag-list-item"><a href="https://graphyhao.gitee.io/tags/hugo/" class="tag-list-link">hugo</a><span
                    class="tag-list-count">1</span></li>
            
            
            <li class="tag-list-item"><a href="https://graphyhao.gitee.io/tags/test/" class="tag-list-link">test</a><span
                    class="tag-list-count">3</span></li>
            
            
            <li class="tag-list-item"><a href="https://graphyhao.gitee.io/tags/web/" class="tag-list-link">web</a><span
                    class="tag-list-count">1</span></li>
            
            
            <li class="tag-list-item"><a href="https://graphyhao.gitee.io/tags/%E5%81%9A%E6%B8%B8%E6%88%8F/" class="tag-list-link">做游戏</a><span
                    class="tag-list-count">1</span></li>
            
            
            <li class="tag-list-item"><a href="https://graphyhao.gitee.io/tags/%E8%BD%AF%E5%B7%A5%E5%AF%BC%E8%AE%BA/" class="tag-list-link">软工导论</a><span
                    class="tag-list-count">12</span></li>
            
        </ul>

    </div>
</div>
      
<div class="widget">
    <h3 class="widget-title">最新文章</h3>
    <div class="widget-body">
        <ul class="recent-post-list list-unstyled no-thumbnail">
            <li>
                <div class="item-inner">
                    <p class="item-title">
                        <a href="https://graphyhao.gitee.io/2021/09/21_h1/" class="title">Unity3D_HW_1_井字棋</a>
                    </p>
                    <p class="item-date">
                        <time datetime="2021-09-20 07:00:04 &#43;0800 CST" itemprop="datePublished">2021-09-20</time>
                    </p>
                </div>
            </li>
            <li>
                <div class="item-inner">
                    <p class="item-title">
                        <a href="https://graphyhao.gitee.io/2020/11/h9/" class="title">软工导论_作业九</a>
                    </p>
                    <p class="item-date">
                        <time datetime="2020-11-20 07:00:04 &#43;0800 CST" itemprop="datePublished">2020-11-20</time>
                    </p>
                </div>
            </li>
            <li>
                <div class="item-inner">
                    <p class="item-title">
                        <a href="https://graphyhao.gitee.io/2020/11/h8-2/" class="title">软工导论_作业八[2]</a>
                    </p>
                    <p class="item-date">
                        <time datetime="2020-11-15 07:00:04 &#43;0800 CST" itemprop="datePublished">2020-11-15</time>
                    </p>
                </div>
            </li>
            <li>
                <div class="item-inner">
                    <p class="item-title">
                        <a href="https://graphyhao.gitee.io/2020/11/h8-1/" class="title">软工导论_作业八[1]</a>
                    </p>
                    <p class="item-date">
                        <time datetime="2020-11-10 07:00:04 &#43;0800 CST" itemprop="datePublished">2020-11-10</time>
                    </p>
                </div>
            </li>
            <li>
                <div class="item-inner">
                    <p class="item-title">
                        <a href="https://graphyhao.gitee.io/2020/10/h7/" class="title">软工导论_作业七</a>
                    </p>
                    <p class="item-date">
                        <time datetime="2020-10-13 07:00:04 &#43;0800 CST" itemprop="datePublished">2020-10-13</time>
                    </p>
                </div>
            </li>
        </ul>
    </div>
</div>
  </div>
</aside>

    
    
<aside class="sidebar sidebar-toc collapse" id="collapseToc" itemscope itemtype="http://schema.org/WPSideBar">
  <div class="slimContent">
    <h4 class="toc-title">文章目录</h4>
    <nav id="toc" class="js-toc toc">

    </nav>
  </div>
</aside>
<main class="main" role="main"><div class="content">
  <article id="-" class="article article-type-" itemscope
    itemtype="http://schema.org/BlogPosting">
    
    <div class="article-header">
      <h1 itemprop="name">
  <a
    class="article-title"
    href="/2021/09/21_h1/"
    >Unity3D_HW_1_井字棋</a
  >
</h1>

      <div class="article-meta">
        
<span class="article-date">
  <i class="icon icon-calendar-check"></i>&nbsp;
<a href="https://graphyhao.gitee.io/2021/09/21_h1/" class="article-date">
  <time datetime="2021-09-20 07:00:04 &#43;0800 CST" itemprop="datePublished">2021-09-20</time>
</a>
</span>
<span class="article-category">
  <i class="icon icon-folder"></i>&nbsp;
  <a class="article-category-link" href="/categories//">  </a>
</span>  
  <span class="article-tag">
    <i class="icon icon-tags"></i>&nbsp;
    <a class="article-tag-link" href="/tags//">  </a>
  </span>

	<span class="article-read hidden-xs">
    	<i class="icon icon-eye-fill" aria-hidden="true"></i>
    	<span id="https://graphyhao.gitee.io/2021/09/21_h1/" class="leancloud_visitors"  data-flag-title="Unity3D_HW_1_井字棋">0</span>
    </span>
        <span class="post-comment"><i class="icon icon-comment"></i>&nbsp;<a href="/2021/09/21_h1/#comments"
            class="article-comment-link">评论</a></span>
		<span class="post-wordcount hidden-xs" itemprop="wordCount">字数统计: 2740字</span>
		<span class="post-readcount hidden-xs" itemprop="timeRequired">阅读时长: 6分 </span>
      </div>
    </div>
    
    
    <audio controls>
      <source src="/music/Mitch Murder - killer angels [mqms2].mp3" type="audio/mpeg">
      您的浏览器不支持 audio 元素。
    </audio>


    <div class="article-entry marked-body js-toc-content" itemprop="articleBody">
      <h1 id="hw_1_井字棋">HW_1_井字棋</h1>
<h3 id="19335084-黄梓浩">19335084 黄梓浩</h3>
<h3 id="博客链接httpsgraphyhaogiteeio20210921_h1">博客链接：https://graphyhao.gitee.io/2021/09/21_h1/</h3>
<h3 id="演示链接-httpswwwbilibilicomvideobv1g64y187sb">演示链接： <a href="https://www.bilibili.com/video/BV1G64y187SB">https://www.bilibili.com/video/BV1G64y187SB</a></h3>
<hr>
<h2 id="实验初期">实验初期</h2>
<hr>
<h3 id="实验要求">实验要求</h3>
<ul>
<li>实现一个井字棋小游戏。（可以实现人机模式和双人对战模式的切换，还可以在机器人的下棋算法上面下刀）</li>
<li>仅可以使用 IMGUI 构建UI，就是说不能用一般的 Canvas 对象实现。</li>
<li>需要ECS的架构实现，指Entity、Component和System的分离。</li>
</ul>
<h3 id="实验前期的准备">实验前期的准备</h3>
<ul>
<li>
<p>配置环境：在Unity3D下完成，Windows10系统下进行，脚本语言使用C#。</p>
</li>
<li>
<p>初期构想游戏画面，参考知名游戏Draw &amp; Guess，想要达到差不多的画面。</p>
</li>
<li>
<p>绘制所需的素材，棋子和棋盘：</p>
<p><img src="/images/homework/unity/hw1/1.png" alt="素材"></p>
</li>
</ul>
<h3 id="游戏画面如何呈现">游戏画面如何呈现</h3>
<ul>
<li>
<p>因为实验要求IMGUI的内容要少，所以没有想将游戏画面直接呈现在UI上的打算，所以一开始做了场景建模，棋盘以及9个棋子的位置。</p>
<p><img src="/images/homework/unity/hw1/2.png" alt="场景"></p>
</li>
<li>
<p>想法是将图上Cube的Material材质替换为自己的 O 或 X 的图片素材，就可以有落子的效果。</p>
</li>
</ul>
<h3 id="ui怎么实现">UI怎么实现</h3>
<ul>
<li>
<p>需要实现出点什么地方就在什么地方下棋的功能，就需要UI中有九个按钮，并且大小和位置都和场景中的棋盘是透视对齐的。</p>
</li>
<li>
<p>其他还需要一个切换模式的按钮，以及计分板。</p>
</li>
</ul>
<h3 id="在大体确定了外观方面的问题就可以着手内部代码了">在大体确定了外观方面的问题就可以着手内部代码了。</h3>
<hr>
<h2 id="实验中期">实验中期</h2>
<hr>
<h3 id="ui部分的代码">UI部分的代码</h3>
<ul>
<li>
<p>UI的代码绑定在一个GUIrunner的空物体上</p>
</li>
<li>
<p>因为UI要精简代码，所以按钮响应的操作都是使用其他脚本里的函数。</p>
</li>
<li>
<p>Unity中可以通过 <code> GameObject.Find(&quot;xxx&quot;).GetComponent&lt;xx_script&gt;().fun( )</code>的方式来调用其他脚本的函数，也可以直接设置函数为 <code>public static</code>就可以直接用类的方式调用: <code>xxx_class.fun()</code>。</p>
</li>
<li>
<p>比如按钮是这样实现的。</p>
</li>
</ul>
<pre><code>        // 九个位置下棋的按钮，使用main_script类中的put方法
        for(int i=0;i&lt;3;++i)
        for(int j=0;j&lt;3;++j){
            if(GUI.Button (new Rect (0+j*230,0+i*230,200*size_factor,200*size_factor), &quot;&quot;)){
                main_script.put(i*3+j,main_script.now_who);
            }  
        }
</code></pre>
<h3 id="主程序代码--main_scriptcs">主程序代码  <code>main_script.cs</code></h3>
<ul>
<li>脚本中有两个部分，一个部分是为了让外部可以使用的，所以是<code>public static</code>的，另一部分是脚本自己使用的(但也不多)。</li>
</ul>
<pre><code>    public static int[,] chess_arr = new int[4,4];  //棋盘状态，0表示空，1表示O棋，-1表示X棋
    public static bool remake_flag = false;         //是否在重开阶段（结束后显示重新开始按钮）
    public static string ifwin_msg = &quot;&quot;;            //游戏结束信息，谁获胜了
    public static int first_one = -1;               //当局先手哪一方
    public static int now_who = 1;                  //当前回合哪一方下棋
    public static bool mode_flag = true;            //对应游戏模式，true人机模式，false双人模式
    public static int[] game_score = {0,0};         //游戏的比分，切换模式会清空


        //在 一位置pos(0~8) 下 哪一方side(1或-1) 的棋子的外部可呼唤的函数
    public static bool put(int pos,int side)

        //重开游戏函数
    public static void remake(int mode)

        //给一个位置的棋子染色为O或X的方法
    public Material mat_o;
    public Material mat_x;
    bool color_chess(int pos,int side)

        //机器人下棋的方法，输入step是目前的步数
    void bot_put(int step)
</code></pre>
<p>下面具体说明各个方法为什么要实现，是如何实现的，</p>
<h3 id="下棋的方法--public-static-bool-putint-posint-side">下棋的方法  <code>public static bool put(int pos,int side)</code></h3>
<ul>
<li>为了让按钮可以下棋才实现的方法</li>
<li>pos是0~8表示下棋的位置，对应井字棋的九宫格，side是1或-1，表示是O棋还是X棋。
(具体代码比较繁琐，下面只展示一般注释过程)</li>
</ul>
<pre><code>    检验输入的pos和side的合法性
    检验变量 chess_arr，这个位置是不是空的
    对这个位置的棋子染色（场景中的棋子）
    
    而后立刻开始检测是否有获胜：
        即分别计算chess_arr[,]的3行3列以及两条斜边的和，是否等于3或-3
            为3表O棋胜，-3则X棋，同时还要有平局判断（棋子下满的情况）
            满足，就置remake_flag为true，表示游戏结束进入重开阶段

    最后，如果当前模式是人机模式 且 这次下棋是人类执行的 
        就进行一次 bot_put() （机器下棋操作）
    
    now_who= -now_who，表示现在到另一方下棋了
</code></pre>
<h3 id="重开的方法-public-static-void-remakeint-mode">重开的方法 <code>public static void remake(int mode)</code></h3>
<ul>
<li>
<p>这里的mode可输入0或1，0表示不改变当前模式，1表示改变当前模式。</p>
</li>
<li>
<p>除此之外至少普通的清空初始化操作，没有特殊的地方。</p>
</li>
</ul>
<h3 id="渲染场景棋子的方法-bool-color_chessint-posint-side">渲染场景棋子的方法 <code>bool color_chess(int pos,int side)</code></h3>
<ul>
<li>代码有些繁但其实比较简练，主要是用对象名找Cube，然后改变Material为对应的Resources中的O棋和X棋的图片素材。</li>
</ul>
<pre><code>        if(side==1)  GameObject.Find(&quot;Cube (&quot;+(pos+1).ToString()+&quot;)&quot;).GetComponent&lt;MeshRenderer&gt;().material = Resources.Load&lt;Material&gt;(&quot;Materials/oc&quot;);
        if(side==-1)  GameObject.Find(&quot;Cube (&quot;+(pos+1).ToString()+&quot;)&quot;).GetComponent&lt;MeshRenderer&gt;().material = Resources.Load&lt;Material&gt;(&quot;Materials/xc&quot;);
       
</code></pre>
<hr>
<h2 id="不会输的机器人下棋的方法--bot_putint-step">不会输的机器人下棋的方法 <code> bot_put(int step)</code></h2>
<ul>
<li>
<p>因为井字棋的技巧已经被研究的很透彻了，所以实现一个绝对不会输的机器人还是比较容易的。</p>
</li>
<li>
<p>具体方法根据 <a href="https://zhidao.baidu.com/question/1439247721219081979.html">https://zhidao.baidu.com/question/1439247721219081979.html</a> 该链接的【井字棋3步必胜技巧是什么？】所简化。</p>
</li>
<li>
<p>代码繁杂，简述注释过程：</p>
</li>
</ul>
<pre><code>如果现在是第零步，说明机器人先手，随机选择四个角落或者中间的位置下棋（使用put方法）

如果是第一步，说明机器人后手，能选中间就选中间

如果是第三步，机器人后手，如果人类占据了两个对角，那么随机选择除了四个角落和中间以外的四个位置。

对整个棋盘搜索有没有下了就直接胜利的位置，或者是必须要堵住对手的位置，注意这里直接胜利的优先级比堵住对手更高。

如果到现在还没有选位置，那就执行以下操作：（一种不会失败的策略）
        if(r==-1){
            if(chess_arr[1,1]==-1){
                if(chess_arr[0,0]==1&amp;&amp;chess_arr[2,2]==0)   r=8;
                if(chess_arr[2,0]==1&amp;&amp;chess_arr[0,2]==0)   r=2;
                if(chess_arr[0,2]==1&amp;&amp;chess_arr[2,0]==0)   r=6;
                if(chess_arr[2,2]==1&amp;&amp;chess_arr[0,0]==0)   r=0;
            }
            if(chess_arr[0,0]==-1&amp;&amp;chess_arr[2,2]==0)   r=8;
            if(chess_arr[2,0]==-1&amp;&amp;chess_arr[0,2]==0)   r=2;
            if(chess_arr[0,2]==-1&amp;&amp;chess_arr[2,0]==0)   r=6;
            if(chess_arr[2,2]==-1&amp;&amp;chess_arr[0,0]==0)   r=0;
        }
如果到现在还没选，那就选中间（被占的话还是不能选）

如果还没选，那就选四个角落的一个空位

如果还没选，就搜索棋盘的剩余空位，能选就选
</code></pre>
<p>自此，主要脚本的方法都描述完了</p>
<hr>
<h2 id="实验后期">实验后期</h2>
<hr>
<h3 id="对ui的优化">对UI的优化</h3>
<ul>
<li>
<p>要使得当前回合是谁可以更直观表示出来，我可以改变按钮被选中时的样式。</p>
<p><img src="/images/homework/unity/hw1/3.png" alt="深色的是按钮样式"></p>
</li>
<li>
<p>使用 GUIskin来改变按钮的样式，实现后UI的所有代码如下：</p>
</li>
</ul>
<pre><code>void OnGUI ()
    {
        //现在是哪一方 就给 按钮 使用 相应的样式
        GUI.skin=(main_script.now_who==1)?customSkin_1:customSkin_1_r;
        //居中的棋盘按钮组合
        GUI.BeginGroup (new Rect (Screen.width / 2-335, Screen.height / 2-335, 670, 670));
        if(main_script.remake_flag==false)
        // 九个位置下棋的按钮，使用put方法
        for(int i=0;i&lt;3;++i)
        for(int j=0;j&lt;3;++j){
            if(GUI.Button (new Rect (0+j*230,0+i*230,200*size_factor,200*size_factor), &quot;&quot;)){
                main_script.put(i*3+j,main_script.now_who);
            }  
        }
        GUI.skin=customSkin_2;
        if(main_script.remake_flag==true)
            if(GUI.Button (new Rect (0,0,670,670), main_script.ifwin_msg+&quot;\n&quot;+&quot;重新开始&quot;))
                main_script.remake(0);
        GUI.EndGroup ();

        if(GUI.Button (new Rect (0,0,185,85), &quot;当前&quot;+ ((main_script.mode_flag)?&quot;人机&quot;:&quot;人人&quot;) +&quot;\n切换模式&quot;))
            main_script.remake(1);
        GUI.Label(new Rect(0,400,185,40),&quot;红蓝比分\n&quot;);
        GUI.Label(new Rect(0,440,185,40),(main_script.game_score[0]).ToString()+&quot; : &quot;+ (main_script.game_score[1]).ToString());
    }
</code></pre>
<h3 id="问题-分辨率问题">问题： 分辨率问题</h3>
<ul>
<li>
<p>在导出之后发现UI和窗口的分辨率对应不上，这导致那几个按钮不能很好地一一对应到场景上。</p>
</li>
<li>
<p>解决的方法是 固定了分辨率，并重新调节了这些尺寸。</p>
</li>
<li>
<p>但是其实有更好的方法，可以设定一个<code>scale_factor</code>来动态地根据窗口大小调节这些UI的尺寸。</p>
</li>
<li>
<p>我认为这反映了，需要直接对应场景的物体的UI 并不是一个很好的方式。</p>
</li>
</ul>
<h3 id="问题-ecs框架如何实现">问题： ECS框架如何实现</h3>
<ul>
<li>
<p>实际上到最后我也没能完全弄清楚如何实现这种框架，只是简单地把代码绑定到空物体上而不是实际物体上去，使用其他的内存变量存储数据，在一个主要脚本中写主要的代码程序。</p>
</li>
<li>
<p>但这个工程里涉及现实场景物体的数据其实也不多，如果非要使用ECS框架实现起来可能会过于繁琐。</p>
</li>
</ul>
<h3 id="最后的实现效果">最后的实现效果</h3>
<ul>
<li>左上角按钮切换模式，切换的同时会重新开始游戏</li>
<li>每轮默认是O棋先下，下一轮换另一方先手。</li>
<li>左边同时显示双方比分。</li>
<li>强大的不会失败的机器人棋手。</li>
</ul>
<h3 id="演示链接-httpswwwbilibilicomvideobv1g64y187sb-1">演示链接： <a href="https://www.bilibili.com/video/BV1G64y187SB">https://www.bilibili.com/video/BV1G64y187SB</a></h3>
<p><img src="/images/homework/unity/hw1/4.png" alt="实现"></p>
<h3 id="博客链接httpsgraphyhaogiteeio20210921_h1-1">博客链接：https://graphyhao.gitee.io/2021/09/21_h1/</h3>
<h3 id="演示链接-httpswwwbilibilicomvideobv1g64y187sb-2">演示链接： <a href="https://www.bilibili.com/video/BV1G64y187SB">https://www.bilibili.com/video/BV1G64y187SB</a></h3>

    </div>
    <div class="article-footer">
<blockquote class="mt-2x">
  <ul class="post-copyright list-unstyled">
    <li class="post-copyright-link hidden-xs">
      <strong>本文链接: </strong>
      <a href="https://graphyhao.gitee.io/2021/09/21_h1/" title="Unity3D_HW_1_井字棋" target="_blank" rel="external">https://graphyhao.gitee.io/2021/09/21_h1/</a>
    </li>
    <li class="post-copyright-license">
      <strong>License：</strong><a href="http://creativecommons.org/licenses/by/4.0/deed.zh" target="_blank" rel="external">CC BY 4.0 CN</a>
    </li>
  </ul>
</blockquote>

<div class="panel panel-default panel-badger">
  <div class="panel-body">
    <figure class="media">
      <div class="media-left">
        <a href="https://graphyhao.gitee.io/" target="_blank" class="img-burn thumb-sm visible-lg">
          <img src="https://graphyhao.gitee.io/yun.jpeg" class="img-rounded w-full" alt="">
        </a>
      </div>
      <div class="media-body">
        <h3 class="media-heading"><a href="https://graphyhao.gitee.io/" target="_blank"><span class="text-dark">GraphyHao</span><small class="ml-1x">瓜皮浩的博客</small></a></h3>
        <div>Press &lt;R&gt; to restart !</div>
      </div>
    </figure>
  </div>
</div>
    </div>
  </article>
<section id="comments">
    <div id="vcomments"></div>
</section>

</div><nav class="bar bar-footer clearfix" data-stick-bottom>
    <div class="bar-inner">
        <ul class="pager pull-left">
            <li class="prev">
                <a href="https://graphyhao.gitee.io/2020/11/h9/" title="软工导论_作业九"><i
                        class="icon icon-angle-left"
                        aria-hidden="true"></i><span>&nbsp;&nbsp;下一篇</span></a>
            </li>
            
            <li class="toggle-toc">
                <a class="toggle-btn collapsed" data-toggle="collapse" href="#collapseToc" aria-expanded="false"
                    title="文章目录" role="button">
                    <span>[&nbsp;</span><span>文章目录</span>
                    <i class="text-collapsed icon icon-anchor"></i>
                    <i class="text-in icon icon-close"></i>
                    <span>]</span>
                </a>
            </li>
        </ul>
        <div class="bar-right">
            <div class="share-component" data-sites="weibo,qq,wechat,twitter"
                data-mobile-sites="weibo,wechat,qq,qzone"></div>
        </div>
    </div>
</nav>

</main><footer class="footer" itemscope itemtype="http://schema.org/WPFooter">
<ul class="social-links">
    <li><a href="https://github.com/hatut" target="_blank" title="github" data-toggle=tooltip data-placement=top >
            <i class="icon icon-github"></i></a></li>
    <li><a href="https://www.pixiv.net/users/21571559" target="_blank" title="twitter" data-toggle=tooltip data-placement=top >
            <i class="icon icon-twitter"></i></a></li>
</ul>
  <div class="copyright">
    &copy;2019  -
    2021
    <div class="publishby">
        Theme base on <a href="https://github.com/xiaoheiAh" target="_blank"> xiaoheiAh </a> 's <a href="https://github.com/xiaoheiAh/hugo-theme-pure" target="_blank"> pure</a>.
    </div>
  </div>
</footer>

<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_SVG"></script>
<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
            showMathMenu: false, //disables context menu
            tex2jax: {
            inlineMath: [ ['$','$'], ['\\(','\\)'] ]
           }
    });
</script>


<script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"></script>
<script>
    window.jQuery || document.write('<script src="js/jquery.min.js"><\/script>')
</script>
<script type="text/javascript" src="https://cdn.staticfile.org/highlight.js/9.15.10/highlight.min.js"></script>
<script type="text/javascript" src="https://cdn.staticfile.org/highlight.js/9.15.10/languages/python.min.js" defer></script>
<script type="text/javascript" src="https://cdn.staticfile.org/highlight.js/9.15.10/languages/javascript.min.js" defer></script><script>
    hljs.configure({
        tabReplace: '    ', 
        classPrefix: ''     
        
    })
    hljs.initHighlightingOnLoad();
</script>
<script src="https://graphyhao.gitee.io/js/application.min.bdeb64b910570b6c41badc6a05b7afb0c8ad9efd8525de3c7257d59e786326a3.js"></script>
<script src="https://graphyhao.gitee.io/js/plugin.min.51ff8c7317566f82259170fa36e09c4493adc9b9378b427a01ad3f017ebac7dd.js"></script>

<script>
    (function (window) {
        var INSIGHT_CONFIG = {
            TRANSLATION: {
                POSTS: '文章',
                PAGES: '页面',
                CATEGORIES: '分类',
                TAGS: '标签',
                UNTITLED: '(未命名)',
            },
            ROOT_URL: 'https:\/\/graphyhao.gitee.io\/',
            CONTENT_URL: 'https:\/\/graphyhao.gitee.io\/\/searchindex.json ',
        };
        window.INSIGHT_CONFIG = INSIGHT_CONFIG;
    })(window);
</script>
<script type="text/javascript" src="https://graphyhao.gitee.io/js/insight.min.a343cd9a5a7698336b28ef3a7c16a3a1b1d2d5fb17dc8ed04022bbe08cc5459073a15bdafa3a8a58cdd56080784bdd69fa70b1ae8597565c799c57ed00f0e120.js" defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tocbot/4.4.2/tocbot.min.js"></script>
<script>
    tocbot.init({
        
        tocSelector: '.js-toc',
        
        contentSelector: '.js-toc-content',
        
        headingSelector: 'h1, h2, h3',
        
        hasInnerContainers: true,
    });
</script>

<script src="https://cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/valine"></script>
<script type="text/javascript">
    var GUEST = ['nick', 'mail', 'link'];
    var meta = 'nick,mail';
    meta = meta.split(',').filter(function (item) {
        return GUEST.indexOf(item) > -1;
    });
    new Valine({
        el: '#vcomments',
        verify: null ,
        notify: true ,
        appId: '5344hnGlswDIeceT6KP94TcD-gzGzoHsz',
        appKey: 'uheypCj1LpGPTz0PQVb60YOS',
        placeholder: '发条友善的评论~',
        avatar: 'retro',
        meta: meta,
        pageSize: '10' || 10,
        visitor: true 
});
</script>

  </body>
</html>
